package com.zeratul.gateway.application.config;

import cn.dev33.satoken.reactor.filter.SaReactorFilter;
import cn.dev33.satoken.router.SaRouter;
import com.zeratul.common.core.result.R;
import com.zeratul.common.core.result.codes.ResultCodes;
import com.zeratul.common.json.utils.JsonUtils;
import com.zeratul.common.satoken.utils.LoginHelper;
import com.zeratul.gateway.application.prop.ZeratulGatewayProperties;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * SaToken认证配置类
 */
@Configuration
public class SaTokenAuthConfig {

    @Autowired
    private ZeratulGatewayProperties zeratulGatewayProperties;

    /**
     * 注册 Sa-Token全局过滤器
     */
    @Bean
    public SaReactorFilter getSaReactorFilter() {
        return new SaReactorFilter()
                // 拦截地址，/** 表示拦截全部地址
                .addInclude("/**")
                // 鉴权方法：每次访问进入
                .setAuth(obj -> {
                    //注意，这里必须嵌套一层路由处理，不能直接做登录判断，不然zeratulGatewayProperties.getIgnoreUrls()无法实现动态刷新的效果
                    SaRouter.match("/**")
                            .notMatch(zeratulGatewayProperties.getIgnoreUrls())
                            .check(r -> {
                                //认证校验，判断是否登录，权限校验交给后端服务自主控制
                                LoginHelper.checkLogin();
                            });
                })
                // 异常处理方法：每次setAuth函数出现异常时进入
                .setError(e -> JsonUtils.toJsonString(R.fail(ResultCodes.AUTH_ERROR, e.getMessage())));
    }
}
